From 8290b39f2b324c1c486ec42f952a1276c9904109 Mon Sep 17 00:00:00 2001 From: Daniel Kiper Date: Thu, 25 Aug 2016 14:02:53 +0200 Subject: [PATCH] x86/boot: call reloc() using stdcall calling convention Current reloc() call method makes confusion and does not scale well for more arguments. And subsequent patch adding multiboot2 protocol support have to pass 3 arguments instead of 2. Hence, move reloc() call to stdcall calling convention. One may argue that we should use standard cdecl calling convention. However, stdcall is better here than cdecl because we do not need to remove "manually" arguments from stack in xen/arch/x86/boot/head.S assembly file. Suggested-by: Jan Beulich Signed-off-by: Daniel Kiper Acked-by: Jan Beulich --- xen/arch/x86/boot/head.S | 3 ++- xen/arch/x86/boot/reloc.c | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S index 85770e8e94..5538a4bda0 100644 --- a/xen/arch/x86/boot/head.S +++ b/xen/arch/x86/boot/head.S @@ -119,7 +119,8 @@ __start: /* Save the Multiboot info struct (after relocation) for later use. */ mov $sym_phys(cpu0_stack)+1024,%esp - push %ebx + push %eax /* Boot trampoline address. */ + push %ebx /* Multiboot information address. */ call reloc mov %eax,sym_phys(multiboot_ptr) diff --git a/xen/arch/x86/boot/reloc.c b/xen/arch/x86/boot/reloc.c index 9ae42e23b8..28c6cea2a6 100644 --- a/xen/arch/x86/boot/reloc.c +++ b/xen/arch/x86/boot/reloc.c @@ -10,15 +10,16 @@ * Keir Fraser */ -/* entered with %eax = BOOT_TRAMPOLINE */ +/* + * This entry point is entered from xen/arch/x86/boot/head.S with: + * - 0x4(%esp) = MULTIBOOT_INFORMATION_ADDRESS, + * - 0x8(%esp) = BOOT_TRAMPOLINE_ADDRESS. + */ asm ( " .text \n" " .globl _start \n" "_start: \n" - " push %eax \n" - " push 0x8(%esp) \n" - " call reloc \n" - " ret $0x4 \n" + " jmp reloc \n" ); typedef unsigned int u32; -- 2.30.2